# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：4.9 元组.py
# 开发时间：2021/3/22 16:19

# 元组 tuple
# 元组是不可变序列，操作方式基本与列表一致，所以操作时，把元组当成不可变的列表即可
# 一般需要数据不改变时，使用元组，否则使用列表

# 创建一个元组
# my_tuple = ()  # 空元组
my_tuple = (1, 2, 3, 4, 5)
print(my_tuple, type(my_tuple), id(my_tuple))

# 元组是不可变对象，不能尝试为元组中元素重新赋值
# my_tuple[4] = 10  # TypeError: 'tuple' object does not support item assignment

# 当元组是非空元组时，可省略括号
my_tuple = 1, 2, 3, 4, 5
# 如果元组是非空元组，至少要有一个逗号隔开
# my_tuple = 1,
# my_tuple = 1
print(type(my_tuple))
# 平时因为需要规范，所以还是写好一点

# 元组的解包(解构)
# 解构是指将元组中每一个元素分别赋值给一个遍变量
# my_tuple = 1, 2, 3, 4
# a, b, c, d = my_tuple  # 解构赋值
# print(my_tuple)
# print('a = ', a)
# print('b = ', b)
# print('c = ', c)
# print('d = ', d)
# print(my_tuple[0])

# 元组的优势
a = 100
b = 200
print(a, b)
# 如果需要互换a,b的值，这时我们可以利用元组的解构
a, b = b, a
print(a, b)

# 还有一种情况：在对元组j进行解包时，变量的数量必须和元组中的数量一致
my_tuple = 10, 20, 30, 40, 50
# 不一致时会报错
# a, b = my_tuple  # ValueError: too many values to unpack (expected 2)
# 可以在变量前添加*，这样该变量会获取元组中剩余的所有元素，带*的变量返回的是一个列表
a, b, *c = my_tuple
print(a, b, c)
a, *b, c = my_tuple
print(a, b, c)
*a, b, c = my_tuple
print(a, b, c)
# 不能同时出现两个*
# a, *b, *c = my_tuple  # SyntaxError: two starred expressions in assignment
# print(a, b, c)

# 解包不只是对元组生效，列表也可以
a, b, *c = [1, 2, 3, 4, 5]
print(a, b, c)
a, b, *c = 'hello world'
print(a, b, c)
